<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <script>
      // 实现一个mybind方法

      // bind的使用
      function fn(a, b) {
        console.log("fn:", this, a, b);
        return "你好";
      }

      // fn.bind({name:123})(1,2);

      // 实现一个mybind函数 ；

      // function mybind(fn, obj) {
      //     obj = obj || window;    // 如果obj传入的是null 或者 undefined 那么  obj就是window
      //     obj = Object(obj); // 如果 obj 是一个简单数据类型 ，那么 通过Object函数把简单数据类型转成包装对象；
      //     obj.arg = fn; // 给传入的对象添加一个fn属性 ，symbol(); 通过对象调用的时候，那么 函数里的this就是这个对象；
      //     return function (...myargs) {
      //         var res = obj.arg(...myargs); // 通过对象来调用 对象里的arg函数（fn函数）
      //         //   console.log("------",res)
      //         // 删除对象里的这个属性
      //         delete obj.arg;
      //         return res;
      //     }
      // }

      // var res = mybind(fn, { name: 123 })(1, 2);
      // console.log(res);

      // var myobj = {
      //     name:"hello"
      // }

      // myobj = Object(1111);
      // console.log(myobj);

      // 把mybind函数 挂载在大Function 的原型上，让所有的函数都可以调用；
      Function.prototype.mybind = function (obj) {
        obj = obj || window; // 如果obj传入的是null 或者 undefined 那么  obj就是window
        obj = Object(obj); // 如果 obj 是一个简单数据类型 ，那么 通过Object函数把简单数据类型转成包装对象；
        obj.arg = this; // 给传入的对象添加一个fn属性 ，symbol(); 通过对象调用的时候，那么 函数里的this就是这个对象；
        return function (...myargs) {
          var res = obj.arg(...myargs); // 通过对象来调用 对象里的arg函数（fn函数）
          //   console.log("------",res)
          // 删除对象里的这个属性
          delete obj.arg;
          return res;
        };
      };

      fn.mybind({ name: 123 })(1, 2); // 调用fn函数  且改变fn函数里的this指向
    </script>
  </body>
</html>
